
#include "include/muduo/net/TcpServer.h"
#include "include/muduo/net/EventLoop.h"
#include "include/muduo/net/TcpConnection.h"
#include <iostream>
#include <functional>
#include <unordered_map>

class TranslateServer
{
public:
    TranslateServer(int port = 8085)
        :_server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port),
                 "TranslateServer", muduo::net::TcpServer::kReusePort)
    {
        //std::bind 是一个函数适配器函数，对指定的函数进行参数绑定
        //typedef std::function<void (const TcpConnectionPtr&)> ConnectionCallback;
        _server.setConnectionCallback(std::bind(&TranslateServer::onConnection, this, std::placeholders::_1));

        //typedef std::function<void (const TcpConnectionPtr&,Buffer*,Timestamp)> MessageCallback;
        _server.setMessageCallback(std::bind(&TranslateServer::onMessage, this, std::placeholders::_1
                                  , std::placeholders::_2, std::placeholders::_3));
    }

    //开始运行服务器的接口
    void start()
    {
        _server.start(); //服务器开始监听
        _baseloop.loop(); //开始事件监控，死循环的阻塞接口 epoll_wait(,,,-1)
    }

private:
    //连接建立成功的回调函数,  在连接成功和关闭的时候被调用一次
    void onConnection(const muduo::net::TcpConnectionPtr& conn)
    {
        if(conn->connected() == true)
        {
            std::cout << "新连接建立成功" << std::endl;
        }
        else
        {
            std::cout << "新连接关闭" << std::endl;
        }
    }

    std::string translate(const std::string& str)
    {
        std::unordered_map<std::string, std::string> dict_map = 
        {
            {"good", "好"}, {"gg", "没了"}, {"吃饭", "米饭"} 
        };

        auto it = dict_map.find(str);
        if(it == dict_map.end())
        {
            return "没有找到";
        }
        
        return it->second;
    }

    //通信连接受到请求时的一个回调函数
    void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buff, muduo::Timestamp)
    {
        //1,从buffer里面把数据拿出来，2，调用translate得出结构，3，发送给客户端
        std::string str = buff->retrieveAllAsString(); 
        std::string resp = translate(str);
        conn->send(resp);
    }
    
private:
    //_baseloop是epoll的事件监控
    muduo::net::EventLoop  _baseloop;
    muduo::net::TcpServer _server;
};


int main()
{
    TranslateServer server(8085);
    server.start();

    return 0;
}